package functionalInterface;

import java.util.function.Function;

/**
    Function<T,R>接口用来转换类型，前者称为前置条件，后者称为后置条件。
    Function接口中包含抽象方法：
        R apply(T t):根据类型T的参数获取类型R的结果。例如:将String类型转换为Integer类型。
        andThen(Function<R,V> after):用来进行组合操作

 */
public class Demo08Function {

    public static void main(String[] args) {
        /*---apply(T t)方法-------------------------*/
        //定义一个字符串类型的整数
        String s = "1234";
        //调用change方法,传递字符串类型的整数,和Lambda表达式
//        change(s,(String str)->{
//            //把字符串类型的整数,转换为Integer类型的整数返回
//            return Integer.parseInt(str);
//        });
        //优化Lambda
        int change = change(s, str -> Integer.parseInt(str));
        System.out.println(change);

        /*---andThen(Function<R,V> after)方法-------------------------*/

        /**
         * 分析:
         *         转换了两次
         *         第一次是把String类型转换为了Integer类型
         *             所以我们可以使用Function<String,Integer> fun1
         *                 Integer i = fun1.apply("123")+10;
         *         第二次是把Integer类型转换为String类型
         *             所以我们可以使用Function<Integer,String> fun2
         *                 String s = fun2.apply(i);
         *         我们可以使用andThen方法,把两次转换组合在一起使用
         *             String s = fun1.andThen(fun2).apply("123");
         *             fun1先调用apply方法,把字符串转换为Integer
         *             fun2再调用apply方法,把Integer转换为字符串
         */
        //调用change方法,传递字符串和两个Lambda表达式
        change(s,(String str)->{
            //把字符串转换为整数+10
            return Integer.parseInt(str)+10;
        },(Integer i)->{
            //把整数转换为字符串
            return i+"";
        });

        //优化Lambda表达式
        change(s,str->Integer.parseInt(str)+10,i->i+"");


    }

    /**
     * apply()方法,把字符串类型的整数,转换为Integer类型的整数
     */
    public static int change(String s, Function<String,Integer> fun){
        //Integer in = fun.apply(s);
        return fun.apply(s); //自动拆箱 Integer->int
    }

    /**
     * andThen()方法,进行Function组合操作
     * 参数再传递两个Function接口
     *     一个泛型使用Function<String,Integer>
     *     一个泛型使用Function<Integer,String>
     */
    public static void change(String s, Function<String,Integer> fun1,Function<Integer,String> fun2){
        String ss = fun1.andThen(fun2).apply(s);
        System.out.println(ss);
    }
}
